package com.xthh;

import android.app.Application;
import android.content.Context;
import android.graphics.Bitmap;
import com.xthh._ble.HH_BleCommunicator;
import com.xthh._enum.HH_EnumDeviceColorType;
import com.xthh._enum.HH_EnumErrorCode;
import com.xthh._enum.pic_storage.HH_EnumPicStorage_BrushType;
import com.xthh._enum.pic_storage.HH_EnumPicStorage_PicIndex;
import com.xthh._function.HH_Logging;
import com.xthh._function.HH_PicUtils;
import com.xthh._function.HH_SystemUtil;
import com.xthh._struct.HH_T_RGB;
import com.xthh._struct.HH_T_RGB_TJ;
import com.xthh._struct.HH_T_SNInfo;
import com.xthh._struct.HH_T_ScanResult;
import com.xthh._struct.HH_T_SystemParams;
import java.util.ArrayList;
import java.util.List;


public class XTCore {

    /*
    * 所有函数的身份认证信息，慎重添写
    * deviceIdentity 身份验证信息固定长度10字节，牢记密钥，也可以添空，*慎用*否则会引起无法刷图
    * */


    public static final int MSG_LOG         = 624;
    public static final int MSG_PROGRESS    = 625;
    public static final int MSG_SPININFO    = 626;


    // 复旦微的临时编码
    public static final int DEVICE_NUMBER_ESL = 9999;

    /**
     * Bitmap抖点
     * @param bitmap
     * @param deviceColorType       支持的颜色类型
     * @param shake                 是否使用抖点算法，或色阶算法
     * @param shakeType             抖点算法样式，1或2，算法样式略微差异（色阶算法无效）
     * @return
     */
    public static Bitmap PicDither(Bitmap bitmap, HH_EnumDeviceColorType deviceColorType, boolean shake, int shakeType){
        //return HH_PicUtils.PicDither(bitmap, deviceColorType, shake, shakeType, 0);
        // 250905
        if (shake){
            // dither
            return HH_PicUtils.PicDither(bitmap, deviceColorType, shakeType, 7);
        } else {
            return HH_PicUtils.PicDither(bitmap, deviceColorType, 0, 7);
        }
    }

    /***
     * 抖点
     * @param bitmap
     * @param deviceColorType
     * @param type  0色阶，1正常亮度抖点，2颜色调暗抖点
     * @param pointCount 扩散点个数，2-7，越大图片越细腻
     * @return
     */
    public static Bitmap PicDither(Bitmap bitmap, HH_EnumDeviceColorType deviceColorType, int type, int pointCount){
        return HH_PicUtils.PicDither(bitmap, deviceColorType, type, pointCount);
    }

    /***
     * 还原真实图片颜色
     * @param bitmap
     * @param deviceColorType
     * @return
     */
    public static Bitmap ChangeBitmapColor(Bitmap bitmap, HH_EnumDeviceColorType deviceColorType){
        return HH_PicUtils.ChangeBitmapColor(bitmap, deviceColorType);
    }

    /**
     * 获取颜色出现次数
     * @return
     */
    public static List<HH_T_RGB_TJ> GetPicColorTypeCount(Bitmap b){
        return HH_PicUtils.GetPicColorTypeCount(b);
    }

    /**
     * 获取SDK版本号
     * @return
     */
    public static int GetLibVer(){
        return HH_BleCommunicator.GetLibVer();
    }

    /**
     *  获取固件版本号(需要在线程中获取)
     * @param systemParams
     * @param mac
     * @return
     */
    public static String GetHardVersion(HH_T_SystemParams systemParams, String mac){
        return HH_BleCommunicator.GetHardVersion(systemParams, mac);
    }

    /**
     * 扫描所有标签或指定MAC地址的标签（阻塞方式）
     * @param tp
     * @param mac 为空时获取所有标签，只有一个MAC址址获取当前标签
     * @return
     */
    public static ArrayList<HH_T_ScanResult> Scan(HH_T_SystemParams tp, String mac){
        return HH_BleCommunicator.Scan(tp, mac);
    }

    /**
     * 扫描所有标签或指定MAC地址的标签（阻塞方式）
     * @param tp
     * @param mac 为空时获取所有标签，只有一个MAC址址获取当前标签
     * @return
     */
    public static void Scan2(HH_T_SystemParams tp, String mac){
        HH_BleCommunicator.Scan2(tp, mac);
    }


    public static void StopScan(){
        HH_BleCommunicator.StopScan();
    }

    /**
     * 停止当前的刷图
     */
    public static void StopBrushPic() {
        HH_BleCommunicator.StopBrushPic();
    }

    /**
     * 刷图
     * @param systemParams
     * @param mac
     * @param data
     * @param pageIntervalTime 发送大包的间隔时间毫秒
     * @param useBrushOrder 数据传输入完成，是否需要添加刷图指令，通常手机壳需要添加，其它的不需要
     * @param deviceIdentity 身份验证信息固定长度10字节，牢记密钥，也可以添空，*慎用*否则会引起无法刷图
     * @param brushDelayTime 数据传输后等待时间，MS，默认添1
     * @param epdParams EPD驱动参数，1字节，（-1时自动设置，-2保持不变，其它手动设置）
     * @return
     */
    public static HH_EnumErrorCode BrushPic(HH_T_SystemParams systemParams,
                                            String mac,
                                            List<Integer> data,
                                            int pageIntervalTime, boolean useBrushOrder,
                                            String deviceIdentity, int brushDelayTime, int epdParams){
        return HH_BleCommunicator.BrushPic(systemParams, mac, data, pageIntervalTime, useBrushOrder, deviceIdentity, brushDelayTime, epdParams);
    }

    /**
     *
     * @param systemParams
     * @param mac
     * @param data
     * @param pageIntervalTime
     * @param useBrushOrder
     * @param deviceIdentity
     * @return
     */
    public static HH_EnumErrorCode BrushPic(HH_T_SystemParams systemParams,
                                            String mac, List<Integer> data,
                                            int pageIntervalTime,
                                            boolean useBrushOrder,
                                            String deviceIdentity){
        return HH_BleCommunicator.BrushPic(systemParams, mac, data, pageIntervalTime, useBrushOrder, deviceIdentity, 1, -1);
    }


    public static HH_EnumErrorCode BrushPrism(HH_T_SystemParams systemParams, String mac, List<Integer> data, int pageIntervalTime, boolean useBrushOrder, String deviceIdentity, int brushDelayTime, byte []prismParams, int prismParamsLen){
        return HH_BleCommunicator.BrushPrism(systemParams, mac, data, pageIntervalTime, useBrushOrder, deviceIdentity, brushDelayTime, prismParams, prismParamsLen);
    }


    /**
     *
     * @param systemParams
     * @param mac
     * @param data
     * @param pageIntervalTime
     * @param deviceIdentity
     * @param picIndex 图片序号，0-6，其中0表示删除所有图片，1-6表示图片序号
     * @param brushType 刷新类型，0表示保存并立即刷新，1表示保存但不刷新，2表示图片轮播（从图片1开始），3定时任务（暂无效），4表示删除当前序号的图片
     * @param intervalTime 轮播间隔时间（0-255），0表示停止轮播，其它表示轮播间隔时间，单位-分钟
     * @param delIndex brushType==4时，就不用picIndex了， 这里为空时全删除，其它表示需要删除的序号
     * @return
     */
    public static HH_EnumErrorCode ImageStorage(HH_T_SystemParams systemParams,
                                           String mac,
                                           List<Integer> data,
                                           int pageIntervalTime,
                                           String deviceIdentity,
                                           HH_EnumPicStorage_PicIndex picIndex,
                                           HH_EnumPicStorage_BrushType brushType,
                                           int intervalTime,
                                           int []delIndex){
        return HH_BleCommunicator.ImageStorage(systemParams, mac, data, pageIntervalTime, deviceIdentity, picIndex, brushType, intervalTime, delIndex);
    }

    /**
     * NFC断电
     * @param tp
     * @param mac
     * @param deviceIdentity
     * @return
     */
    public static HH_EnumErrorCode NFCClose(HH_T_SystemParams tp, String mac, String deviceIdentity){
        return HH_BleCommunicator.NFCClose(tp, mac, deviceIdentity);
    }


    /**
     * 灯控指令
     * @param tp
     * @param mac
     * @param deviceIdentity
     * @param colorType
     * @param color
     * @param duration
     * @return
     */
    public static HH_EnumErrorCode LedControl(HH_T_SystemParams tp, String mac, String deviceIdentity, int colorType, int color, int duration){
        return HH_BleCommunicator.LedControl(tp, mac, deviceIdentity, colorType, color, duration);
    }




    /**
     * NFC解锁
     * @param tp
     * @param mac
     * @param deviceIdentity
     * @return
     */
    public static HH_EnumErrorCode NFCUnLock(HH_T_SystemParams tp, String mac, String deviceIdentity){
        return HH_BleCommunicator.NFCUnLock(tp, mac, deviceIdentity);
    }


    /**
     * OTA标签
     * @param tp
     * @param mac
     * @param path OTA文件路径
     * @param pageIntervalTime 发送大包的间隔时间毫秒
     * @param deviceIdentity
     * @return
     */
    public static HH_EnumErrorCode OTA(HH_T_SystemParams tp, String mac, String path, int pageIntervalTime, String deviceIdentity){
        return HH_BleCommunicator.OTA(tp, mac, path, pageIntervalTime, deviceIdentity);
    }

    /**
     * 标签身份认证，加解密，慎重调用
     * @param tp
     * @param mac
     * @param deviceIdentity 身份验证信息固定长度10字节，牢记密钥，也可以添空，*慎用*否则会引起无法刷图
     * @param open true加密 false解密
     * @return
     */
    public static HH_EnumErrorCode IdentityEncryption(HH_T_SystemParams tp, String mac, String deviceIdentity, boolean open){
        return HH_BleCommunicator.IdentityEncryption(tp, mac, deviceIdentity, open);
    }

    /**
     * 获取详细SN信息
     * @param sn
     * @return
     */
    public static HH_T_SNInfo GetTagSNInfo(String sn) {
        if (sn == null || sn.length() != 17)
            return new HH_T_SNInfo();

        return new HH_T_SNInfo(sn.substring(0, 2),
                sn.substring(2, 3),
                sn.substring(3, 5),
                sn.substring(5, 7),
                sn.substring(7, 9),
                sn.substring(9, 11),
                sn.substring(11));
    }

    /**
     * 将传入的Bitmap转换为需要发送的数据
     * @param bitmap
     * @param colorType
     * @return
     */
    public static List<Integer> GetSendPicData(Bitmap bitmap, HH_EnumDeviceColorType colorType){
        return HH_PicUtils.GetSendPicData(bitmap, colorType);
    }

    /**
     * 将传入的Bitmap转换为需要发送的数据
     * @param bitmap
     * @param colorType
     * @param useCompress true为压缩
     * @return
     */
    public static List<Integer> GetSendPicData(Bitmap bitmap, HH_EnumDeviceColorType colorType, boolean useCompress){
        return HH_PicUtils.GetSendPicData(bitmap, colorType, useCompress);
    }


    /**
     * 设置在调用HH_Logging.i接口时，是否自动写入文件
     * @param writeFile
     */
    public static void SetLogToFile(boolean writeFile){
        HH_Logging.LOG_FILE = writeFile;
    }

    public static boolean isBlueEnable(Application api){
        return HH_BleCommunicator.isBlueEnable(api);
    }

    /**
     * 获取电量百分比
     * @return
     */
    public static int GetBatteryPercentage(Context ctx){
        return HH_SystemUtil.GetBatteryPercentage(ctx);
    }
}
